package com.shadow.cloud.test.thread;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

public class ThreadGroupHelper<T> {

    /**
     * 最大处理和排队数量
     */
    private final Integer maxNum;
    /**
     * 入口数据持有队列
     */
    private final Queue<T> infoList;

    /**
     * 正在处理的任务列表
     */
    private final Queue<T> delList;

    public ThreadGroupHelper(Integer maxNum) {
        this.maxNum = maxNum;
        this.infoList = new ConcurrentLinkedQueue<>();
        this.delList = new ConcurrentLinkedQueue<>();
    }

    /**
     * 获取或新增队列最前方的入口数据
     * 且获取后移除对应数据
     *
     * @param t 需要新增的入口数据对象 如为获取则传递空
     * @return T 队列最前方的入口数据 为空则说明不存在多余的入口数据了(如为新增也将返回空)
     */
    public synchronized T getOrAddItem(T t) {
        // 此时为获取
        if (t == null) {
            if(this.delList.size() >= this.maxNum){
                return null;
            }
            t = infoList.poll();
            if(t != null){
                this.delList.add(t);
            }
            return t;
        }
        infoList.add(t);
        return null;
    }

    public synchronized boolean canAdd() {
        return this.infoList.size() < maxNum && this.delList.size() < maxNum;
    }

    public synchronized void removeItem(T t) {
        delList.removeIf(next -> next == t);
    }

    public synchronized Integer getDellSize() {
        return this.delList.size();
    }

    public synchronized Integer getWaitSize() {
        return this.infoList.size();
    }
}
